#include <iostream>
#include <signal.h>
#include <unistd.h>

void printBlock()
{
	sigset_t set,oset;
	sigemptyset(&set);
	sigemptyset(&oset);

	sigprocmask(SIG_BLOCK,&set,&oset);
	std::cout << "block: ";

	for(int signo = 31;signo > 0;signo--)
	{
		if(sigismember(&oset,signo))
		{
			std::cout << 1;
		}
		else
		{
			std::cout << '0';
		}
	}
	std::cout << std::endl;
}

void printpinding()
{
	sigset_t pind;
	sigpending(&pind);
	std::cout << "pinding: ";

	for(int signo = 31;signo > 0;signo--)
	{
		if(sigismember(&pind,signo))
		{
			std::cout << 1;
		}
		else
		{
			std::cout << '0';
		}
	}
	std::cout << std::endl;
}


void handler(int signo)
{
	int cut = 0;
	while(true)
	{
		// printBlock();
		std::cout << "get signo: "<< signo << " " << cut++ << std::endl;
		printpinding();

		sleep(1);
		// break;
	}
	// exit(1);
}

int main()
{
	struct sigaction act,oact;
	act.sa_handler = handler;

	//执行完2号信号，其他信号都会恢复
	sigemptyset(&act.sa_mask);
	sigaddset(&act.sa_mask,3);
	sigaddset(&act.sa_mask,4);
	sigaddset(&act.sa_mask,5);
	sigaddset(&act.sa_mask,6);
	sigaddset(&act.sa_mask,7);
	::sigaction(2,&act,&oact);

	while(true)
	{
		// printBlock();
		printpinding();
		::pause();
	}

	return 0;
}

// void PirintBLock()
// {
//     sigset_t set, oset;
//     sigemptyset(&set);
//     sigemptyset(&oset);

//     sigprocmask(SIG_BLOCK, &set, &oset);
//     std::cout << "block: ";
//     for (int signo = 31; signo > 0; signo--)
//     {
//         if (sigismember(&oset, signo))
//         {
//             std::cout << 1;
//         }
//         else
//         {
//             std::cout << 0;
//         }
//     }
//     std::cout << std::endl;
// }

// void PrintPending()
// {
//     sigset_t pending;
//     ::sigpending(&pending);

//     std::cout << "Pending: ";
//     for (int signo = 31; signo > 0; signo--)
//     {
//         if (sigismember(&pending, signo))
//         {
//             std::cout << 1;
//         }
//         else
//         {
//             std::cout << 0;
//         }
//     }
//     std::cout << std::endl;
// }

// void handler(int signo)
// {
//     static int cnt = 0;
//     cnt++;
//     while (true)
//     {
//         std::cout << "get a sig: " << signo << ", cnt: " << cnt << std::endl;
//         // PirintBLock();
//         PrintPending();
//         sleep(1);
//         // break;
//     }
//     // exit(1);
// }

// int main()
// {
//     struct sigaction act, oact;
//     act.sa_handler = handler;
//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask, 3);
//     sigaddset(&act.sa_mask, 4);
//     sigaddset(&act.sa_mask, 5);
//     sigaddset(&act.sa_mask, 6);
//     sigaddset(&act.sa_mask, 7);

//     ::sigaction(2, &act, &oact);

//     while (true)
//     {
//         // PirintBLock();
//         PrintPending();
//         pause();
//     }
// }